package model

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"time"

	"wxpay/pkg/util"

	"gorm.io/datatypes"
)

/*
DB Table Details
-------------------------------------
Table: applyment
[ 0] id                                             INT8                 null: false  primary: true   isArray: false  auto: false  col: INT8            len: -1      default: []
[ 1] apply_no                                       VARCHAR(32)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
[ 2] brand_id                                       VARCHAR(16)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 16      default: []
[ 3] mch_id                                         VARCHAR(32)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
[ 4] applyment_type                                 VARCHAR(16)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 16      default: []
[ 5] applyment_info                                 JSONB                null: false  primary: false  isArray: false  auto: false  col: JSONB           len: -1      default: []
[ 6] wx_applyment_id                                INT8                 null: true   primary: false  isArray: false  auto: false  col: INT8            len: -1      default: []
[ 7] apply_state                                    VARCHAR(32)          null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
[ 8] apply_state_desc                               VARCHAR(32)          null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
[ 9] sign_url                                       VARCHAR(255)         null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 255     default: []
[10] account_validation                             JSONB                null: true   primary: false  isArray: false  auto: false  col: JSONB           len: -1      default: []
[11] sub_mch_id                                     BPCHAR(32)           null: true   primary: false  isArray: false  auto: false  col: BPCHAR          len: 32      default: []
[12] audit_detail                                   JSONB                null: true   primary: false  isArray: false  auto: false  col: JSONB           len: -1      default: []
[13] legal_validation_url                           VARCHAR(255)         null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 255     default: []
[14] create_time                                    TIMESTAMPTZ          null: false  primary: false  isArray: false  auto: false  col: TIMESTAMPTZ     len: -1      default: []
[15] update_time                                    TIMESTAMPTZ          null: false  primary: false  isArray: false  auto: false  col: TIMESTAMPTZ     len: -1      default: []


JSON Sample
-------------------------------------
{    "id": 88,    "mch_id": "HyVuTogGPXXHYCKfaPUDbxMUE",    "wx_applyment_id": 59,    "account_validation": "lswnvIVXGIEZlDLwJCDhZpdrR",    "legal_validation_url": "nksAGJIbsCGtaEAynBWRGxfMl",    "update_time": "2210-09-06T21:54:11.378861738+08:00",    "brand_id": "KjUZLCnyQgByATDZnhhgUUaJL",    "sign_url": "IpqFMISaasgAZKTisgboBxmNC",    "apply_no": "ZSpwOBPcoMttqOFmyWistLxiy",    "applyment_type": "RUivsCAIKsHjldFNmsbRYynFK",    "applyment_info": "plsWTaCywVwlOOGUpHVLYTQOg",    "apply_state_desc": "HgtWVjjGoqXVGaqepUwPvTBDd",    "apply_state": "dDxQnXGLhUATHGFpfTKDdjDMX",    "sub_mch_id": "ldAWCSmpyuywJhfgkRuJmpgyZ",    "audit_detail": "kKiqfAmwjdXpTuKDYaIsmgmUm",    "create_time": "2070-09-07T09:21:05.971213024+08:00"}



*/

// Applyment struct is a row record of the applyment table in the wxpay database
type Applyment struct {
	//[ 0] id                                             INT8                 null: false  primary: true   isArray: false  auto: false  col: INT8            len: -1      default: []
	ID int64 `gorm:"primary_key;column:id;type:INT8;"`
	//[ 1] apply_no                                       VARCHAR(32)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
	ApplyNo    string `gorm:"column:apply_no;type:VARCHAR;size:32;"`
	BizApplyNo string `gorm:"column:biz_apply_no;type:VARCHAR;size:32;"`
	//[ 2] brand_id                                       VARCHAR(16)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 16      default: []
	BrandID string `gorm:"column:brand_id;type:VARCHAR;size:16;"`
	//[ 3] mch_id                                         VARCHAR(32)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
	MchID string `gorm:"column:mch_id;type:VARCHAR;size:32;"`
	//[ 4] applyment_type                                 VARCHAR(16)          null: false  primary: false  isArray: false  auto: false  col: VARCHAR         len: 16      default: []
	ApplymentType string `gorm:"column:applyment_type;type:VARCHAR;size:16;"`
	//[ 5] applyment_info                                 JSONB                null: false  primary: false  isArray: false  auto: false  col: JSONB           len: -1      default: []
	ApplymentInfo datatypes.JSON `gorm:"column:applyment_info;type:JSONB;"`
	//[ 6] wx_applyment_id                                INT8                 null: true   primary: false  isArray: false  auto: false  col: INT8            len: -1      default: []
	WxApplymentID sql.NullInt64 `gorm:"column:wx_applyment_id;type:INT8;"`
	//[ 7] apply_state                                    VARCHAR(32)          null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
	ApplyState sql.NullString `gorm:"column:apply_state;type:VARCHAR;size:32;"`
	//[ 8] apply_state_desc                               VARCHAR(32)          null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 32      default: []
	ApplyStateDesc sql.NullString `gorm:"column:apply_state_desc;type:VARCHAR;size:32;"`
	//[ 9] sign_url                                       VARCHAR(255)         null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 255     default: []
	SignURL sql.NullString `gorm:"column:sign_url;type:VARCHAR;size:255;"`
	//[10] account_validation                             JSONB                null: true   primary: false  isArray: false  auto: false  col: JSONB           len: -1      default: []
	AccountValidation datatypes.JSON `gorm:"column:account_validation;type:JSONB;"`
	//[11] sub_mch_id                                     BPCHAR(32)           null: true   primary: false  isArray: false  auto: false  col: BPCHAR          len: 32      default: []
	SubMchID sql.NullString `gorm:"column:sub_mch_id;type:BPCHAR;size:32;"`
	//[12] audit_detail                                   JSONB                null: true   primary: false  isArray: false  auto: false  col: JSONB           len: -1      default: []
	AuditDetail datatypes.JSON `gorm:"column:audit_detail;type:JSONB;"`
	//[13] legal_validation_url                           VARCHAR(255)         null: true   primary: false  isArray: false  auto: false  col: VARCHAR         len: 255     default: []
	LegalValidationURL sql.NullString `gorm:"column:legal_validation_url;type:VARCHAR;size:255;"`
	//[14] create_time                                    TIMESTAMPTZ          null: false  primary: false  isArray: false  auto: false  col: TIMESTAMPTZ     len: -1      default: []
	CreateTime time.Time `gorm:"column:create_time;type:TIMESTAMPTZ;"`
	//[15] update_time                                    TIMESTAMPTZ          null: false  primary: false  isArray: false  auto: false  col: TIMESTAMPTZ     len: -1      default: []
	UpdateTime time.Time `gorm:"column:update_time;type:TIMESTAMPTZ;"`
}

// TableName sets the insert table name for this struct type
func (apply *Applyment) TableName() string {
	return "applyment"
}

// BusinessLicenseInfo - 营业执照/登记证书信息
type BusinessLicenseInfo struct {
	// 证件扫描件 - MediaID
	BusinessLicenseCopy string `json:"business_license_copy"`
	CopyOssName         string `json:"copy_oss_name"`
	// 证件注册号
	BusinessLicenseNumber string `json:"business_license_number"`
	// 商户名称
	MerchantName string `json:"merchant_name"`
	// 经营者/法定代表人姓名
	LegalPerson string `json:"legal_person"`
	// 注册地址
	CompanyAddress string `json:"company_address,omitempty"`
	// 营业期限
	BusinessTime string `json:"business_time,omitempty"`
}

// OrganizationCertInfo - 组织机构代码证信息
type OrganizationCertInfo struct {
	// 组织机构代码证照片
	OrganizationCopy string `json:"organization_copy"`
	CopyOssName      string `json:"copy_oss_name"`
	// 组织机构代码
	OrganizationNumber string `json:"organization_number"`
	// 组织机构代码有效期限
	OrganizationTime string `json:"organization_time"`
}

// IDCardInfo - 经营者/法人身份证信息
type IDCardInfo struct {
	// 身份证人像面照片
	IDCardCopy  string `json:"id_card_copy"`
	CardOssName string `json:"card_oss_name"`
	// 身份证国徽面照片
	IDCardNational  string `json:"id_card_national"`
	NationalOssName string `json:"national_oss_name"`
	// 身份证姓名
	IDCardName string `json:"id_card_name"`
	// 身份证号码
	IDCardNumber string `json:"id_card_number"`
	// 身份证有效期限
	IDCardValidTime string `json:"id_card_valid_time"`
}

// IDDocInfo - 经营者/法人其他类型证件信息
type IDDocInfo struct {
	// 证件姓名
	IDDocName string `json:"id_doc_name"`
	// 证件号码
	IDDocNumber string `json:"id_doc_number"`
	// 证件照片
	IDDocCopy   string `json:"id_doc_copy"`
	CopyOssName string `json:"copy_oss_name"`
	// 证件结束日期
	DocPeriodEnd string `json:"doc_period_end"`
}

// AccountInfo - 结算银行账户
type AccountInfo struct {
	// 账户类型
	BankAccountType string `json:"bank_account_type"`
	// 开户银行
	AccountBank string `json:"account_bank"`
	// 开户名称
	AccountName string `json:"account_name"`
	// 开户银行省市编码
	BankAddressCode string `json:"bank_address_code"`
	// 开户银行联行号
	BankBranchID string `json:"bank_branch_id,omitempty"`
	// 开户银行全称 （含支行）
	BankName string `json:"bank_name,omitempty"`
	// 银行帐号
	AccountNumber string `json:"account_number"`
}

// ContactInfo - 超级管理员信息
type ContactInfo struct {
	// 超级管理员类型
	ContactType string `json:"contact_type"`
	// 超级管理员姓名
	ContactName string `json:"contact_name"`
	// 超级管理员身份证件号码
	ContactIDCardNumber string `json:"contact_id_card_number"`
	// 超级管理员手机
	MobilePhone string `json:"mobile_phone"`
	// 超级管理员邮箱
	ContactEmail string `json:"contact_email,omitempty"`
}

// SalesSceneInfo - 店铺信息
type SalesSceneInfo struct {
	// 店铺名称
	StoreName string `json:"store_name"`
	// 店铺链接
	StoreURL string `json:"store_url,omitempty"`
	// 店铺二维码
	StoreQrCode string `json:"store_qr_code,omitempty"`
	// 小程序AppID
	MiniProgramSubAppID string `json:"mini_program_sub_appid,omitempty"`
}

// ApplymentInfo - 进件申请
type ApplymentInfo struct {
	// 主体类型
	OrganizationType string `json:"organization_type"`
	// 营业执照/登记证书信息
	BusinessLicenseInfo *BusinessLicenseInfo `json:"business_license_info,omitempty"`
	// 组织机构代码证信息
	OrganizationCertInfo *OrganizationCertInfo `json:"organization_cert_info,omitempty"`
	// 经营者/法人证件类型
	IDDocType string `json:"id_doc_type,omitempty"`
	// 经营者/法人身份证信息
	IDCardInfo *IDCardInfo `json:"id_card_info,omitempty"`
	// 经营者/法人其他类型证件信息
	IDDocInfo *IDDocInfo `json:"id_doc_info,omitempty"`
	// 是否填写结算银行账户
	NeedAccountInfo bool `json:"need_account_info"`
	// 结算银行账户
	AccountInfo *AccountInfo `json:"account_info,omitempty"`
	// 超级管理员信息
	ContactInfo ContactInfo `json:"contact_info"`
	// 店铺信息
	SalesSceneInfo SalesSceneInfo `json:"sales_scene_info"`
	// 商户简称
	MerchantShortname string `json:"merchant_shortname"`
	// 特殊资质
	Qualifications []string `json:"qualifications,omitempty"`
	// 补充材料
	BusinessAdditionPics []string `json:"business_addition_pics,omitempty"`
	// 补充说明
	BusinessAdditionDesc string `json:"business_addition_desc,omitempty"`
}

// ToJSON - 进件申请json序列化
func (info *ApplymentInfo) ToJSON() (r datatypes.JSON) {
	r, _ = json.Marshal(info)
	return
}

// ToStruct - 进件申请json反序列化
func (info *ApplymentInfo) ToStruct(r datatypes.JSON) {
	b, _ := r.MarshalJSON()
	_ = json.Unmarshal(b, info)
}

// AccountValidation - 汇款账户验证信息
type AccountValidation struct {
	// 付款户名
	AccountName string `json:"account_name"`
	// 付款卡号
	AccountNo string `json:"account_no"`
	// 汇款金额 （以分为单位）
	PayAmount string `json:"pay_amount"`
	// 收款卡号
	DestinationAccountNumber string `json:"destination_account_number"`
	// 收款户名
	DestinationAccountName string `json:"destination_account_name"`
	// 开户银行
	DestinationAccountBank string `json:"destination_account_bank"`
	// 省市信息
	City string `json:"city"`
	// 备注信息
	Remark string `json:"remark"`
	// 汇款截止时间
	Deadline string `json:"deadline"`
}

// ToJSON - 账户验证信息json序列化
func (info *AccountValidation) ToJSON() (r datatypes.JSON) {
	r, _ = json.Marshal(info)
	return
}

// ToStruct - 账户验证信息json反序列化
func (info *AccountValidation) ToStruct(r datatypes.JSON) {
	b, _ := r.MarshalJSON()
	_ = json.Unmarshal(b, info)
}

// AuditDetails 驳回原因详情列表
type AuditDetails []AuditDetail

// AuditDetail 驳回原因
type AuditDetail struct {
	// 参数名称
	ParamName string `json:"param_name"`
	// 驳回原因
	RejectReason string `json:"reject_reason"`
}

// ToJSON 驳回原因详情列表序列化
func (info AuditDetails) ToJSON() (r datatypes.JSON) {
	r, _ = json.Marshal(info)
	return
}

// ToStruct 驳回原因详情列表反序列化
func (info *AuditDetails) ToStruct(r datatypes.JSON) {
	b, _ := r.MarshalJSON()
	_ = json.Unmarshal(b, info)
}

// 电商收付通申请材料的业务性校验
func (info *ApplymentInfo) validate() error {
	switch info.OrganizationType {
	case "2401", "2500":
		if info.IDDocType != "IDENTIFICATION_TYPE_MAINLAND_IDCARD" {
			return fmt.Errorf("小微和个人卖家的经营者/法人证件类型只能选择身份证")
		}
	case "2", "4":
		if info.BusinessLicenseInfo == nil {
			return fmt.Errorf("个体工商户、企业必须提供营业执照")
		}
		if len(info.BusinessLicenseInfo.BusinessLicenseNumber) != 18 && info.OrganizationCertInfo == nil {
			return fmt.Errorf("营业执照号码不是18位时，必须提供组织机构代码证信息")
		}
	case "3", "1708":
		if info.BusinessLicenseInfo == nil {
			return fmt.Errorf("党政、机关及事业单位/其他组织必须提供登记证书")
		}
		if len(info.BusinessLicenseInfo.BusinessLicenseNumber) != 18 && info.OrganizationCertInfo == nil {
			return fmt.Errorf("党政、机关及事业单位/其他组织且营业执照/登记证书号码不是18位时，必须提供组织机构代码证信息")
		}
	}
	switch info.IDDocType {
	case "IDENTIFICATION_TYPE_MAINLAND_IDCARD":
		if info.IDCardInfo == nil {
			return fmt.Errorf("需要身份证信息")
		}
	default:
		if info.IDDocInfo == nil {
			return fmt.Errorf("需要其他证件信息")
		}
	}
	if info.NeedAccountInfo && info.AccountInfo == nil {
		return fmt.Errorf("需要提供结算银行账户信息")
	}
	if info.SalesSceneInfo.StoreURL == "" && info.SalesSceneInfo.StoreQrCode == "" {
		return fmt.Errorf("店铺二维码or店铺链接二选一必填")
	}
	return nil
}

// Validate 进件申请业务校验
func (apply *Applyment) Validate() error {
	if apply.ApplymentType == "ecommerce" {
		info := &ApplymentInfo{}
		info.ToStruct(apply.ApplymentInfo)
		return info.validate()
	} else if apply.ApplymentType == "sub" {
		info := &SubApplymentInfo{}
		info.ToStruct(apply.ApplymentInfo)
		return info.validate()
	}
	return nil
}

// IsNewState 检查状态是否有更新
func (apply *Applyment) IsNewState(state string) (isNew bool) {
	isNew = util.ConvertNullString(apply.ApplyState) != state
	return
}

// UpdateState 更新申请单状态
func (apply *Applyment) UpdateState(state string, desc string, signURL string, subMchID string, accountV *AccountValidation, auditD *AuditDetails) {
	apply.ApplyState = util.AdaptNullString(state)
	apply.ApplyStateDesc = util.AdaptNullString(desc)
	apply.UpdateTime = util.GetNow()
	if state == "NEED_SIGN" {
		apply.SignURL = util.AdaptNullString(signURL)
	}
	switch state {
	case "NEED_SIGN", "FINISH":
		apply.SubMchID = util.AdaptNullString(subMchID)
	case "ACCOUNT_NEED_VERIFY":
		apply.AccountValidation = accountV.ToJSON()
	case "REJECTED", "FROZEN":
		apply.AuditDetail = auditD.ToJSON()
	}
}

// IsFinalState 进件申请是否终态
func (apply *Applyment) IsFinalState() bool {
	switch util.ConvertNullString(apply.ApplyState) {
	case "FINISH", "FROZEN", "REJECTED":
		return true
	}
	return false
}

// CanReApply 是否可以重新提交：仅被驳回申请可以修改申请后重新提交
func (apply *Applyment) CanReApply() bool {
	return util.ConvertNullString(apply.ApplyState) == "REJECTED"
}

// 微信特约商户进件请求
type SubApplymentInfo struct {
	// 超级管理员信息
	ContactInfo *SubContactInfo `json:"contact_info"`
	// 主体资料信息
	SubjectInfo *SubjectInfo `json:"subject_info"`
	// 经营资料
	BusinessInfo *BusinessInfo `json:"business_info"`
	// 结算规则
	SettlementInfo *SettlementInfo `json:"settlement_info"`
	// 结算银行账户
	BankAccountInfo *AccountInfo `json:"bank_account_info"`
	// 补充材料
	AdditionInfo *AdditionInfo `json:"addition_info"`
}

// ToJSON 特约商户申请信息序列化
func (info *SubApplymentInfo) ToJSON() (r datatypes.JSON) {
	r, _ = json.Marshal(info)
	return
}

// ToStruct 特约商户申请信息反序列化
func (info *SubApplymentInfo) ToStruct(r datatypes.JSON) {
	b, _ := r.MarshalJSON()
	_ = json.Unmarshal(b, info)
}

func (info *SubApplymentInfo) validate() error {
	if info.ContactInfo == nil {
		return fmt.Errorf("超级管理员信息必填")
	}
	if info.SubjectInfo == nil {
		return fmt.Errorf("主体资料必填")
	}
	if err := info.SubjectInfo.validate(); err != nil {
		return err
	}
	if info.BusinessInfo == nil {
		return fmt.Errorf("经营资料必填")
	}
	if err := info.BusinessInfo.validate(); err != nil {
		return err
	}
	if info.SettlementInfo == nil {
		return fmt.Errorf("结算规则必填")
	}
	if info.BankAccountInfo == nil && !util.ContainsStr([]string{"719", "721", "716", "717", "730", "739", "727", "738", "726"}, info.SettlementInfo.SettlementId) {
		return fmt.Errorf("结算银行账户必填")
	}
	return nil
}

// 本系统目前主要支持餐饮零售，则不判断行业就直接铆钉费率id
func (info *SubApplymentInfo) SetSettlementId() {
	switch info.SubjectInfo.SubjectType {
	case "SUBJECT_TYPE_MICRO":
		info.SettlementInfo.SettlementId = "703"
	case "SUBJECT_TYPE_INDIVIDUAL":
		info.SettlementInfo.SettlementId = "719"
	case "SUBJECT_TYPE_ENTERPRISE":
		info.SettlementInfo.SettlementId = "716"
	}
}

type SubContactInfo struct {
	// 超级管理员姓名
	ContactName string `json:"contact_name"`
	// 超级管理员身份证件号码
	ContactIdNumber string `json:"contact_id_number"`
	// 联系手机
	MobilePhone string `json:"mobile_phone"`
	// 联系邮箱
	ContactEmail string `json:"contact_email"`
}

type SubBusinessLicenseInfo struct {
	// 营业执照照片
	LicenseCopy    string `json:"license_copy"`
	OssLicenseCopy string `json:"oss_license_copy"`
	// 注册号/统一社会信用代码
	LicenseNumber string `json:"license_number"`
	// 商户名称
	MerchantName string `json:"merchant_name"`
	// 个体户经营者/法人姓名
	LegalPerson string `json:"legal_person"`
}

// 登记证书 主体为党政、机关及事业单位/其他组织，必填
type CertificateInfo struct {
	// 登记证书照片
	CertCopy    string `json:"cert_copy"`
	OssCertCopy string `json:"oss_cert_copy"`
	// 登记证书类型
	CertType string `json:"cert_type"`
	// 证书号
	CertNumber string `json:"cert_number"`
	// 商户名称
	MerchantName string `json:"merchant_name"`
	// 注册地址
	CompanyAddress string `json:"company_address"`
	// 法人姓名
	LegalPerson string `json:"legal_person"`
	// 有效期限开始日期
	PeriodBegin string `json:"period_begin"`
	// 有效期限结束日期
	PeriodEnd string `json:"period_end"`
}

type OrganizationInfo struct {
	// 组织机构代码证照片
	OrganizationCopy    string `json:"organization_copy"`
	OssOrganizationCopy string `json:"oss_organization_copy"`
	// 组织机构代码
	OrganizationCode string `json:"organization_code"`
	// 组织机构代码证有效期开始日期
	OrgPeriodBegin string `json:"org_period_begin"`
	// 组织机构代码证有效期结束日期
	OrgPeriodEnd string `json:"org_period_end"`
}

// 身份证信息
type SubIDCardInfo struct {
	// 身份证人像面照片
	IdCardCopy     string `json:"id_card_copy"`
	OssIdCardCopay string `json:"oss_id_card_copay"`
	// 身份证国徽面照片
	IdCardNational    string `json:"id_card_national"`
	OssIdCardNational string `json:"oss_id_card_national"`
	// 身份证姓名
	IdCardName string `json:"id_card_name"`
	// 身份证号码
	IdCardNumber string `json:"id_card_number"`
	// 身份证有效期开始时间
	CardPeriodBegin string `json:"card_period_begin"`
	// 身份证有效期结束时间
	CardPeriodEnd string `json:"card_period_end"`
}

// 其他类型证件信息
type SubIDDocInfo struct {
	// 证件照片
	IdDocCopy    string `json:"id_doc_copy"`
	OssIdDocCopy string `json:"oss_id_doc_copy"`
	// 证件姓名
	IdDocName string `json:"id_doc_name"`
	// 证件号码
	IdDocNumber string `json:"id_doc_number"`
	//  证件有效期开始时间
	DocPeriodBegin string `json:"doc_period_begin"`
	// 证件有效期结束时间
	DocPeriodEnd string `json:"doc_period_end"`
}

// 经营者/法人身份证件
type IdentityInfo struct {
	// 证据类型
	IdDocType string `json:"id_doc_type"`
	// 身份证信息
	IdCardInfo *SubIDCardInfo `json:"id_card_info"`
	// 其他类型证件
	IdDocInfo *SubIDDocInfo `json:"id_doc_info"`
	//是否为最终受益人
	Owner bool `json:"owner"`
}

type UboInfo struct {
	// 证件类型
	IdType string `json:"id_type"`
	// 身份证人像面照片
	IdCardCopy    string `json:"id_card_copy"`
	OssIdCardCopy string `json:"oss_id_card_copy"`
	// 身份证国徽面照片
	IdCardNational    string `json:"id_card_national"`
	OssIdCardNational string `json:"oss_id_card_national"`
	// 证件照片
	IdDocCopy    string `json:"id_doc_copy"`
	OssIdDocCopy string `json:"oss_id_doc_copy"`
	// 受益人姓名
	Name string `json:"name"`
	// 证件号码
	IdNumber string `json:"id_number"`
	// 证件有效期开始时间
	IdPeriodBegin string `json:"id_period_begin"`
	// 证件有效期结束时间
	IdPeriodEnd string `json:"id_period_end"`
}

// 门店场所
type MicroStoreInfo struct {
	// 门店名称
	MicroName string `json:"micro_name"`
	// 门店省市编码
	MicroAddressCode string `json:"micro_address_code"`
	// 门店地址
	MicroAddress string `json:"micro_address"`
	// 门店门头照片
	StoreEntrancePic    string `json:"store_entrance_pic"`
	OssStoreEntrancePic string `json:"oss_store_entrance_pic"`
	// 门店店内环境照片
	MicroIndoorCopy    string `json:"micro_indoor_copy"`
	OssMicroIndoorCopy string `json:"oss_micro_indoor_copy"`
	// 门店经度
	StoreLongitude string `json:"store_longitude"`
	// 门店纬度
	StoreLatitude string `json:"store_latitude"`
}

// 流动经营/便民服务
type MicroMobileInfo struct {
	// 经营/服务名称
	MicroMobileName string `json:"micro_mobile_name"`
	// 经营/服务所在地省市
	MicroMobileCity string `json:"micro_mobile_city"`
	// 经营/服务所在地（不含省市]
	MicroMobileAddress string `json:"micro_mobile_address"`
	// 经营服务现场照片
	MicroMobilePics    []string `json:"micro_mobile_pics"`
	OssMicroMobilePics []string `json:"oss_micro_mobile_pics"`
}

// 线上商品/服务交易
type MicroOnlineInfo struct {
	// 线上店铺名称
	MicroOnlineStore string `json:"micro_online_store"`
	// 电商平台名称
	MicroEcName string `json:"micro_ec_name"`
	// 店铺二维码
	MicroQrcode    string `json:"micro_qrcode"`
	OssMicroQrcode string `json:"oss_micro_qrcode"`
	// 店铺链接
	MicroLink string `json:"micro_link"`
}

// 小微证明材料
type MicroBizInfo struct {
	// 微信经营类型
	MicroBizType string `json:"micro_biz_type"`
	// 门店场所
	MicroStoreInfo *MicroStoreInfo `json:"micro_store_info"`
	// 流动经营/便民服务
	MicroMobileInfo *MicroMobileInfo `json:"micro_mobile_info"`
	// 线上商品服务交易
	MicroOnlineInfo *MicroOnlineInfo `json:"micro_online_info"`
}

// 主体资料
type SubjectInfo struct {
	// 主体类型
	SubjectType string `json:"subject_type"`
	// 营业执照
	BusinessLicenseInfo *SubBusinessLicenseInfo `json:"business_license_info"`
	// 登记证书
	CertificateInfo *CertificateInfo `json:"certificate_info"`
	// 组织机构代码证
	OrganizationInfo *OrganizationInfo `json:"organization_info"`
	// 单位证明函照片
	CertificateLetterCopy    string `json:"certificate_letter_copy"`
	OssCertificateLetterCopy string `json:"oss_certificate_letter_copy"`
	// 经营者/法人身份证件
	IdentityInfo *IdentityInfo `json:"identity_info"`
	// 最终受益人信息
	UboInfo *UboInfo `json:"ubo_info"`
	// 小微辅助证明材料
	MicroBizInfo *MicroBizInfo `json:"micro_biz_info"`
}

func (s *SubjectInfo) validate() error {
	switch s.SubjectType {
	case "SUBJECT_TYPE_INDIVIDUAL", "SUBJECT_TYPE_ENTERPRISE":
		if s.BusinessLicenseInfo == nil {
			return fmt.Errorf("营业执照必填")
		}
		if len(s.BusinessLicenseInfo.LicenseNumber) != 18 && s.OrganizationInfo == nil {
			return fmt.Errorf("组织结构代码证必填")
		}
	case "SUBJECT_TYPE_INSTITUTIONS", "SUBJECT_TYPE_OTHERS":
		if s.CertificateInfo == nil {
			return fmt.Errorf("登记证书必填")
		}
		if s.OrganizationInfo == nil {
			return fmt.Errorf("组织结构代码证必填")
		}
	case "SUBJECT_TYPE_MICRO":
		if s.MicroBizInfo == nil {
			return fmt.Errorf("小微证明材料必填")
		}
	default:
		return fmt.Errorf("主体类型错误")
	}
	if s.IdentityInfo == nil {
		return fmt.Errorf("经营者/法人身份证件必填")
	}
	if !s.IdentityInfo.Owner && s.UboInfo == nil {
		return fmt.Errorf("最终受益人必填")
	}
	return nil
}

// 服务商进件是否终态
func (apply *Applyment) SubMchCanApply() bool {
	switch util.ConvertNullString(apply.ApplyState) {
	case "APPLYMENT_STATE_REJECTED", "APPLYMENT_STATE_CANCELED":
		return true
	}
	return false
}

// 特约商户进件是否终态
func (apply *Applyment) SubMchIsFinalState() bool {
	switch util.ConvertNullString(apply.ApplyState) {
	case "APPLYMENT_STATE_REJECTED", "APPLYMENT_STATE_FINISHED", "APPLYMENT_STATE_CANCELED":
		return true
	default:
		return false
	}
}

// 设置状态
func (apply *Applyment) SubMchUpdateState() {
	apply.UpdateTime = util.GetNow()
	switch apply.ApplyState.String {
	case "APPLYMENT_STATE_EDITTING":
		apply.ApplyStateDesc = util.AdaptNullString("编辑中")
	case "APPLYMENT_STATE_AUDITING":
		apply.ApplyStateDesc = util.AdaptNullString("审核中")
	case "APPLYMENT_STATE_REJECTED":
		apply.ApplyStateDesc = util.AdaptNullString("已驳回")
	case "APPLYMENT_STATE_TO_BE_CONFIRMED":
		apply.ApplyStateDesc = util.AdaptNullString("待账户验证")
	case "APPLYMENT_STATE_TO_BE_SIGNED":
		apply.ApplyStateDesc = util.AdaptNullString("待签约")
	case "APPLYMENT_STATE_SIGNING":
		apply.ApplyStateDesc = util.AdaptNullString("开通权限中")
	case "APPLYMENT_STATE_FINISHED":
		apply.ApplyStateDesc = util.AdaptNullString("已完成")
	case "APPLYMENT_STATE_CANCELED":
		apply.ApplyStateDesc = util.AdaptNullString("已作废")
	default:
		apply.ApplyStateDesc = util.AdaptNullString("")
	}
}

// 线下门店信息
type BizStoreInfo struct {
	// 门店名称
	BizStoreName string `json:"biz_store_name"`
	// 门店省市编码
	BizAddressCode string `json:"biz_address_code"`
	// 门店地址
	BizStoreAddress string `json:"biz_store_address"`
	// 门店门头照片
	StoreEntrancePic    []string `json:"store_entrance_pic"`
	OssStoreEntrancePic []string `json:"oss_store_entrance_pic"`
	// 门店店内环境照片
	IndoorPic    []string `json:"indoor_pic"`
	OssIndoorPic []string `json:"oss_indoor_pic"`
	// 先下场所对应商家appid
	BizSubAppId string `json:"biz_sub_appid"`
}

// 公众号信息
type MpInfo struct {
	// 服务商公众号APPID
	MpAppId string `json:"mp_appid"`
	// 商家公众号 appid
	MpSubAppId string `json:"mp_sub_appid"`
	// 公众号页面截图
	MpPics    []string `json:"mp_pics"`
	OssMpPics []string `json:"oss_mp_pics"`
}

// 小程序场景
type MiniProgramInfo struct {
	// 服务商小程序APPID
	MiniProgramAppId string `json:"mini_program_appid"`
	// 商家小程序 appid
	MiniProgramSubAppId string `json:"mini_program_sub_appid"`
	// 小程序截图
	MiniProgramPics    []string `json:"mini_program_pics"`
	OssMiniProgramPics []string `json:"oss_mini_program_pics"`
}

// app 场景
type AppInfo struct {
	// 服务商应用APPID
	AppAppId string `json:"app_app_id"`
	// 商家应用 appid
	AppSubAppId string `json:"app_sub_app_id"`
	// 应用页面截图
	AppPics    []string `json:"app_pics"`
	OssAppPics []string `json:"oss_app_pics"`
}

// 互联网场景
type WebInfo struct {
	// 互联网网站域名
	Domain string `json:"domain"`
	// 网站授权函
	WebAuthorisation string `json:"web_authorisation"`
	// 应用页面截图
	WebAppId string `json:"web_app_id"`
}

// 企业微信场景
type WeworkInfo struct {
	// 商家企业微信corpid
	SubCorpId string `json:"sub_corp_id"`
	// 企业微信页截图
	WeworkPics    []string `json:"wework_pics"`
	OssWeworkPics []string `json:"oss_wework_pics"`
}

// 经营场景
type SalesInfo struct {
	// 经营场景类型
	SalesScenesType []string `json:"sales_scenes_type"`
	// 线下门店场景
	BizStoreInfo *BizStoreInfo `json:"biz_store_info"`
	// 公众号场景
	MpInfo *MpInfo `json:"mp_info"`
	// 小程序场景
	MiniProgramInfo *MiniProgramInfo `json:"mini_program_info"`
	// APP 场景
	AppInfo *AppInfo `json:"app_info"`
	// 互联网场景
	WebInfo *WebInfo `json:"web_info"`
	// 企业微信场景
	WeworkInfo *WeworkInfo `json:"wework_info"`
}

func (s *SalesInfo) validate() error {
	if s.SalesScenesType == nil {
		return fmt.Errorf("经营场景类型必填")
	}
	for _, t := range s.SalesScenesType {
		switch t {
		case "SALES_SCENES_STORE":
			if s.BizStoreInfo == nil {
				return fmt.Errorf("缺少下线门店场景配置")
			}
		case "SALES_SCENES_MP":
			if s.MpInfo == nil {
				return fmt.Errorf("缺少公众号配置")
			}
		case "SALES_SCENES_MINI_PROGRAM":
			if s.MiniProgramInfo == nil {
				return fmt.Errorf("缺少小程序配置")
			}
		case "SALES_SCENES_WEB":
			if s.WebInfo == nil {
				return fmt.Errorf("缺少互联网应用配置")
			}
		case "SALES_SCENES_APP":
			if s.AppInfo == nil {
				return fmt.Errorf("缺少APP配置信息")
			}
		case "SALES_SCENES_WEWORK":
			if s.WeworkInfo == nil {
				return fmt.Errorf("缺少企业微信配置信息")
			}
		default:
			return fmt.Errorf("经营类型错误")
		}
	}
	return nil
}

// 经营资料
type BusinessInfo struct {
	// 商户简称
	MerchantShortname string `json:"merchant_shortname"`
	// 客服电话
	ServicePhone string `json:"service_phone"`
	// salesInfo
	SalesInfo *SalesInfo `json:"sales_info"`
}

func (b *BusinessInfo) validate() error {
	if b.SalesInfo != nil {
		return b.SalesInfo.validate()
	}
	return nil
}

// 结算规则
type SettlementInfo struct {
	//    入驻结算规则ID
	SettlementId string `json:"settlement_id"`
	// 所属行业
	QualificationType string `json:"qualification_type"`
	// 特殊资质图片
	Qualifications    []string `json:"qualifications"`
	OssQualifications []string `json:"oss_qualifications"`
	// 优惠费率活动ID
	ActivitiesId string `json:"activities_id"`
	// 优惠费率活动值
	ActivitiesRate string `json:"activities_rate"`
	// 优惠费率活动补充材料
	ActivitiesAdditions    []string `json:"activities_additions"`
	OssActivitiesAdditions []string `json:"oss_activities_additions"`
}

// 补充材料
type AdditionInfo struct {
	// 法人开户承诺函
	LegalPersonCommitment string `json:"legal_person_commitment"`
	// 法人开户意愿视频
	LegalPersonVideo    string `json:"legal_person_video"`
	OssLegalPersonVideo string `json:"oss_legal_person_video"`
	// 补充材料
	BusinessAdditionPics    []string `json:"business_addition_pics"`
	OssBusinessAdditionPics []string `json:"oss_business_addition_pics"`
	// 补充说明
	BusinessAdditionMsg string `json:"business_addition_msg"`
}
